package com.gsdl.model.bo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NoResultException;

import org.apache.log4j.Logger;

import com.gsdl.model.entity.CategoriaMaterial;
import com.gsdl.model.entity.Centro;
import com.gsdl.model.entity.Deposito;
import com.gsdl.model.entity.Material;
import com.gsdl.model.entity.Pedido;
import com.gsdl.model.entity.Movimento;
import com.gsdl.model.entity.Stock;
import com.gsdl.model.entity.Movimento.TipoMovimento;
import com.gsdl.model.entity.Pedido.EstadoPedido;

// TODO: Auto-generated Javadoc
/**
 * The Class MaterialBO.
 */
public class MaterialBO extends BaseBO<Material>{

	/** The Constant LOG. */
	private static final Logger LOG = Logger.getLogger(MaterialBO.class.getName());
	
	/** The instance. */
	private static MaterialBO instance = new MaterialBO();
	
	/**
	 * Gets the single instance of MaterialBO.
	 *
	 * @return single instance of MaterialBO
	 */
	public static MaterialBO getInstance() {
		return instance;
	}
	
	/**
	 * Instantiates a new material bo.
	 */
	private MaterialBO() {
		super(new Material());
	}
    
	/**
	 * Gets the categorias material.
	 *
	 * @return the categorias material
	 */
	public List<CategoriaMaterial> getCategoriasMaterial(){
		return getAll(CategoriaMaterial.class);
	}
	
	
	/**
	 * Save.
	 *
	 * @param material the material
	 * @param stockList the stock list
	 * @return the material
	 */
	public Material save(Material material, List<Stock> stockList){
		material = super.save(material);
		Date data = new Date();
		for(Stock stock: stockList){

        	Movimento movimento = new Movimento();
        	movimento.setPedido(null);
        	movimento.setDataMovimento(data);
        	movimento.setDeposito(stock.getDeposito());
        	movimento.setTipoMovimento(TipoMovimento.ENTRADA);
        	movimento.setMaterial(material);
        	movimento.setQuantidade(stock.getQuantidade());
        	
        	movimento = MovimentoBO.getInstance().save(movimento);
        	StockBO.getInstance().updateStock(movimento);
        }

		return material;
	}
	
	/**
	 * Gets the by centro.
	 *
	 * @param centro the centro
	 * @return the by centro
	 */
	@SuppressWarnings("unchecked")
	public List<Material> getByCentro(Centro centro){
		
		EntityManager em = null;
        try {
            em = getEntityManager();
          
            List<Material> materialList = (List<Material>)  em.createNamedQuery("Material.findByCentro")
            		.setParameter("centroId", centro.getId())
            		.getResultList();
            return materialList;
            
        }catch (NoResultException ex) {
            LOG.warn(ex.getMessage());
        }catch (Exception ex) {
        	LOG.warn(ex.getMessage());
        }finally{
        	
        	closeSession(em);
        }
        
		return new ArrayList<Material>();
	}
	
}
